﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Studio7i.CapaDominio;
using Studio7i.CapaPersistencia;
using Studio7i.CapaPersistencia.DAO;

namespace Studio7i.CapaPruebas
{
    [TestFixture]
    public class Test_ArmadoDeReservaDAO
    {
        // Atributos a utilizar durante las pruebas        
        ISalaDAO salaDAO = null;
        IArmadoDeSalaDAO armadosalaDAO = null;
        IAdministradorDAO administradorDAO = null;
        ILocalDAO localDAO = null;
        IClienteDAO clienteDAO = null;
        IReservaDAO reservaDAO = null;
        IArmadoReservaDAO armadoreservaDAO = null;
        IInstrumentoDAO instrumentoDAO = null;
        IServicioDAO servicioDAO = null;

        private int codigoGenerado = 0;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            armadosalaDAO = new ArmadoSalaDAO();
            foreach (ArmadoDeSala i in armadosalaDAO.ListarTodos()) armadosalaDAO.Eliminar(i);

            armadoreservaDAO = new ArmadoDeReservaDAO();
            foreach (ArmadoDeReserva i in armadoreservaDAO.ListarTodos()) armadoreservaDAO.Eliminar(i);

            servicioDAO = new ServicioDAO();
            foreach (Servicio i in servicioDAO.ListarTodos()) servicioDAO.Eliminar(i);

            instrumentoDAO = new InstrumentoDAO();
            foreach (Instrumento i in instrumentoDAO.ListarTodos()) instrumentoDAO.Eliminar(i);

            administradorDAO = new AdministradorDAO();
            foreach (Administrador i in administradorDAO.ListarTodos()) administradorDAO.Eliminar(i);

            reservaDAO = new ReservaDAO();
            foreach (Reserva i in reservaDAO.ListarTodos()) reservaDAO.Eliminar(i);

            clienteDAO = new CapaPersistencia.DAO.ClienteDAO();
            foreach (Cliente i in clienteDAO.ListarTodos()) clienteDAO.Eliminar(i);

            salaDAO = new CapaPersistencia.DAO.SalaDAO();
            foreach (Sala i in salaDAO.ListarTodos()) salaDAO.Eliminar(i);

            localDAO = new CapaPersistencia.DAO.LocalDAO();
            foreach (Local i in localDAO.ListarTodos()) localDAO.Eliminar(i);

            clienteDAO.Crear(new Cliente() { CoCliente = 1, NoCliente = "Jorge Luis Camarena Cueva", TxMail = "jlccsc19@hotmail.com", FeNacimiento = "05/10/1986", TxtClave = "1234" });
            clienteDAO.Crear(new Cliente() { CoCliente = 2, NoCliente = "Luis Alonso Camarena Juli", TxMail = "luismaximo2@gmail.com", FeNacimiento = "09/11/1987", TxtClave = "1234" });
            clienteDAO.Crear(new Cliente() { CoCliente = 3, NoCliente = "Juan Marcelo Marquez Yataco", TxMail = "juanmmy@hotmail.com", FeNacimiento = "24/09/1972", TxtClave = "1234" });

            servicioDAO.Crear(new Servicio() { nombre = "Grabación de CD", descripcion = "Graba tu propio CD", costoServicio = 15 });
            servicioDAO.Crear(new Servicio() { nombre = "Cantante Profesional", costoServicio = 180, descripcion = "Servicios de un cantante profesional" });
            servicioDAO.Crear(new Servicio() { nombre = "Arreglos", costoServicio = 210, descripcion = "Contratación de un arreglista profesional" });

            instrumentoDAO.Crear(new Instrumento() { tipo = "Guitarra", marca = "Fender", modelo = "Squier", anhoDeFabricacion = 2009, caracteristicas = "Color madera", costoDeAlquiler = 10 });
            instrumentoDAO.Crear(new Instrumento() { tipo = "Guitarra", marca = "Fender", modelo = "Stratocaster", anhoDeFabricacion = 2010, caracteristicas = "Blanca", costoDeAlquiler = 15 });
            instrumentoDAO.Crear(new Instrumento() { tipo = "Bajo", marca = "Yamaha", modelo = "Signature", anhoDeFabricacion = 2011, caracteristicas = "5 cuerdas", costoDeAlquiler = 12 });

            administradorDAO.Crear(new Administrador() { NoAdministrador = "Jose Perez", TxMail = "peslion@gmail.com", FeNacimiento = "05/08/1978", TxtClave = "2010" });
            administradorDAO.Crear(new Administrador() { NoAdministrador = "Hugo Palomino", TxMail = "hpalo@gmail.com", FeNacimiento = "03/01/1976", TxtClave = "1222" });
            administradorDAO.Crear(new Administrador() { NoAdministrador = "Martin Peros", TxMail = "mperos@gmail.com", FeNacimiento = "08/09/1980", TxtClave = "4321" });
            administradorDAO.Crear(new Administrador() { NoAdministrador = "LarryLescano", TxMail = "larrylescano@gmail.com", FeNacimiento = "12/12/1978", TxtClave = "2009" });

            localDAO.Crear(new Local() { NoLocal = "Monterrico", DiTxDireccionreccion = "Av. Primavera 123" });
            localDAO.Crear(new Local() { NoLocal = "Los Olivos", DiTxDireccionreccion = "Av. Las Palmeras 456" });
            localDAO.Crear(new Local() { NoLocal = "San Miguel", DiTxDireccionreccion = "Av. La MArina 1000" });

            salaDAO.Crear(new Sala() { NoSala = "Rock 80s", TxCaracteristicas = "Premium", QtCapacidad = 8, Local = new Local() { CoLocal = 1 }, TxComentario = "Zzz..." });
            salaDAO.Crear(new Sala() { NoSala = "Electrónico 90s", TxCaracteristicas = "VIP", QtCapacidad = 6, Local = new Local() { CoLocal = 2 } });
            salaDAO.Crear(new Sala() { NoSala = "Disco", TxCaracteristicas = "Black", QtCapacidad = 15, Local = new Local() { CoLocal = 3 } });

            armadosalaDAO.Crear(new ArmadoDeSala() { SsArmado = 1, Sala = new Sala() { CoSala = 1 }, Instrumento = new Instrumento { codigo = 1 }, Servicio = new Servicio { codigo = 1 }, Administrador = new Administrador { CoAdministrador = 1 } });
            armadosalaDAO.Crear(new ArmadoDeSala() { SsArmado = 2, Sala = new Sala() { CoSala = 2 }, Instrumento = new Instrumento { codigo = 2 }, Servicio = new Servicio { codigo = 2 }, Administrador = new Administrador { CoAdministrador = 2 } });
            armadosalaDAO.Crear(new ArmadoDeSala() { SsArmado = 3, Sala = new Sala() { CoSala = 3 }, Instrumento = new Instrumento { codigo = 3 }, Servicio = new Servicio { codigo = 3 }, Administrador = new Administrador { CoAdministrador = 3 } });

            reservaDAO.Crear(new Reserva() { FeInicio = "23-09-2011 08:00:00", FeFinal = "23-09-2011 10:00:00", SsReserva = 20, Sala = new Sala() { CoSala = 1 }, Cliente = new Cliente() { CoCliente = 1 } });
            reservaDAO.Crear(new Reserva() { FeInicio = "23-09-2011 12:00:00", FeFinal = "23-09-2011 14:00:00", SsReserva = 15, Sala = new Sala() { CoSala = 2 }, Cliente = new Cliente() { CoCliente = 2 } });
            reservaDAO.Crear(new Reserva() { FeInicio = "24-09-2011 08:00:00", FeFinal = "24-09-2011 12:00:00", SsReserva = 10, Sala = new Sala() { CoSala = 3 }, Cliente = new Cliente() { CoCliente = 3 } });

            armadoreservaDAO.Crear(new ArmadoDeReserva() { CoArmRes = 1, SsArmado = 10, Reserva = new Reserva { CoReserva = 1 }, Instrumento = new Instrumento() { codigo = 1 }, Servicio = new Servicio { codigo = 1 } });
            armadoreservaDAO.Crear(new ArmadoDeReserva() { CoArmRes = 2, SsArmado = 20, Reserva = new Reserva { CoReserva = 2 }, Instrumento = new Instrumento() { codigo = 2 }, Servicio = new Servicio { codigo = 2 } });
            armadoreservaDAO.Crear(new ArmadoDeReserva() { CoArmRes = 3, SsArmado = 30, Reserva = new Reserva { CoReserva = 3 }, Instrumento = new Instrumento() { codigo = 3 }, Servicio = new Servicio { codigo = 3 } });
        }
        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(armadoreservaDAO);
            ArmadoDeReserva ArmadoDeReservaACrear = new ArmadoDeReserva();
            ArmadoDeReservaACrear.SsArmado = 10;
            ArmadoDeReservaACrear.Reserva = new Reserva { CoReserva = 1 };
            ArmadoDeReservaACrear.Instrumento = new Instrumento { codigo = 2 };
            ArmadoDeReservaACrear.Servicio = new Servicio { codigo = 3 };
            ArmadoDeReserva ArmadoDeReservaCreado = null;
            Assert.DoesNotThrow(delegate
            {
                ArmadoDeReservaCreado = armadoreservaDAO.Crear(ArmadoDeReservaACrear);
                codigoGenerado = ArmadoDeReservaCreado.CoArmRes;
            });
            Assert.IsNotNull(ArmadoDeReservaCreado);

            Assert.Greater(ArmadoDeReservaCreado.CoArmRes, 0);            
        }

        [Test]
        public void Test2_Obtener()
        {
            Assert.IsNotNull(armadoreservaDAO);
            int codigo = 2;
            ArmadoDeReserva ArmadoReservaObtenida = null;
            Assert.DoesNotThrow(delegate
            {
                ArmadoReservaObtenida = armadoreservaDAO.Obtener(codigo);
            });
            Assert.IsNotNull(ArmadoReservaObtenida);
            Assert.AreEqual(ArmadoReservaObtenida.CoArmRes, codigo);
        }

        [Test]
        public void Test3_Modificar()
        {
            Assert.IsNotNull(armadoreservaDAO);
            ArmadoDeReserva ArmadoReservaAModificar = armadoreservaDAO.Obtener(2);
            ArmadoReservaAModificar.SsArmado = 20;
            ArmadoReservaAModificar.Reserva = new Reserva { CoReserva = 1 };
            ArmadoReservaAModificar.Instrumento = new Instrumento { codigo = 2 };
            ArmadoReservaAModificar.Servicio = new Servicio { codigo = 1 };
            ArmadoDeReserva ArmadoReservaModificada = null;
            Assert.DoesNotThrow(delegate
            {
               ArmadoReservaModificada = armadoreservaDAO.Modificar(ArmadoReservaAModificar);
            });
            Assert.IsNotNull(ArmadoReservaModificada);

            Assert.AreEqual(ArmadoReservaModificada.CoArmRes, 2);
            Assert.AreEqual(ArmadoReservaModificada.SsArmado, ArmadoReservaAModificar.SsArmado);
            Assert.AreEqual(ArmadoReservaModificada.Reserva.CoReserva, ArmadoReservaAModificar.Reserva.CoReserva);
        }

        [Test]
        public void Test4_Eliminar()
        {
            Assert.IsNotNull(armadoreservaDAO);
            ArmadoDeReserva ArmadoReservaExistente = armadoreservaDAO.Obtener(3);
            Assert.DoesNotThrow(delegate
            {
                armadoreservaDAO.Eliminar(ArmadoReservaExistente);
            });
            Assert.IsNull(armadoreservaDAO.Obtener(3));
        }

        [Test]
        public void Test5_ListarTodos()
        {
            Assert.IsNotNull(armadoreservaDAO);

            ICollection<ArmadoDeReserva> ArmadoReservasEncontradas = null;
            Assert.DoesNotThrow(delegate
            {
                ArmadoReservasEncontradas = armadoreservaDAO.ListarTodos();
            });
            Assert.IsNotNull(ArmadoReservasEncontradas);
            Assert.GreaterOrEqual(ArmadoReservasEncontradas.Count, 1);

            foreach (ArmadoDeReserva ArmadoReservaEncontrada in ArmadoReservasEncontradas)
            {
                Assert.IsNotNull(ArmadoReservaEncontrada);
                Assert.IsInstanceOf(typeof(ArmadoDeReserva), ArmadoReservaEncontrada);
            }
        }

    }
}

